import Dexie from 'dexie';

// 创建数据库实例
const db = new Dexie('NovelReader');

// 定义数据库结构 - 版本1
db.version(1).stores({
  // 小说表 - 存储小说基本信息
  novels: 'id, name, size, modified, cached',
  
  // 章节表 - 存储小说章节信息
  chapters: 'id, novelId, title, position',
  
  // 内容表 - 分片存储小说内容
  contents: 'id, novelId, chunkIndex, data',
  
  // 阅读进度表 - 存储阅读进度
  readingProgress: 'novelId, chapterId, position, timestamp'
});

// 为了避免修改主键结构导致的升级错误，
// 1. 保持原来的主键定义
// 2. 添加一个新的版本，合并所有需要的变更

// 版本5 - 合并所有表结构，不修改已有表的主键
db.version(5).stores({
  // 保持原有表结构不变
  novels: 'id, name, size, modified, cached',
  chapters: 'id, novelId, title, position',
  contents: 'id, novelId, chunkIndex, data',
  readingProgress: 'novelId, chapterId, position, timestamp',
  
  // 新增表
  cacheInfo: 'novelId, lastCached, complete, downloadProgress',
  cacheQueue: 'id',
  backups: '++id, timestamp',
  fullContents: 'novelId, timestamp'
}).upgrade(async tx => {
  console.log('升级到数据库版本5，重新设置数据库结构');
  
  try {
    // 获取所有缓存的小说
    const cachedNovels = await tx.table('novels')
      .where('cached')
      .equals(true)
      .toArray();
    
    console.log(`找到${cachedNovels.length}本缓存的小说，开始迁移...`);
    
    // 处理每本小说
    for (const novel of cachedNovels) {
      try {
        // 获取该小说的所有分片内容
        const chunks = await tx.table('contents')
          .where('novelId')
          .equals(novel.id)
          .toArray();
        
        if (chunks.length === 0) {
          console.log(`小说 ${novel.id} 没有找到分片内容，跳过`);
          continue;
        }
        
        // 按分片索引排序
        chunks.sort((a, b) => (a.chunkIndex || 0) - (b.chunkIndex || 0));
        
        // 合并所有分片内容
        const fullContent = chunks.map(chunk => chunk.data).join('');
        
        // 存储到新表中
        await tx.table('fullContents').put({
          novelId: novel.id,
          data: fullContent,
          timestamp: Date.now()
        });
        
        console.log(`小说 ${novel.id} 的内容已成功迁移到整体存储`);
      } catch (err) {
        console.error(`迁移小说 ${novel.id} 的内容失败:`, err);
        // 继续处理下一本小说
      }
    }
    
    console.log('小说内容迁移完成');
  } catch (err) {
    console.error('数据库升级过程中出现错误:', err);
  }
});

// 简化统计函数，避免循环依赖
db.stats = async () => {
  try {
    // 获取各表记录数量
    const [novels, chapters, contents, readingProgress] = await Promise.all([
      db.novels.count(),
      db.chapters.count(),
      db.contents.count(),
      db.readingProgress.count()
    ]);
    
    return {
      novels,
      chapters,
      contents,
      readingProgress,
      version: db.verno
    };
  } catch (err) {
    console.error('获取数据库统计信息失败:', err);
    return { error: err.message };
  }
};

/**
 * 完全重置数据库的方法
 * @returns {Promise<{status: string, message: string}>} 操作结果
 */
db.resetDatabase = async () => {
  console.log('开始重置数据库...');
  
  try {
    // 关闭当前数据库连接
    await db.close();
    console.log('数据库连接已关闭');
    
    // 删除数据库
    await Dexie.delete('NovelReader');
    console.log('数据库已删除');
    
    // 重新打开数据库，这将自动重新创建结构
    await db.open();
    console.log('数据库已重新创建并打开');
    
    return { status: 'success', message: '数据库已成功重置' };
  } catch (err) {
    console.error('重置数据库失败:', err);
    
    // 尝试重新打开数据库连接
    try {
      await db.open();
    } catch (openErr) {
      console.error('重新打开数据库失败:', openErr);
    }
    
    return { status: 'error', message: `重置数据库失败: ${err.message}` };
  }
};

// 打开数据库并记录错误
db.open()
  .then(() => {
    console.log(`NovelReader数据库初始化完成 (版本: ${db.verno})`);
  })
  .catch(err => {
    console.error('打开数据库失败:', err);
    
    // 如果是升级错误，尝试删除数据库并重新创建
    if (err.name === 'VersionError' || err.name === 'UpgradeError') {
      console.warn('数据库版本错误，将尝试删除并重建数据库...');
      
      // 删除数据库
      Dexie.delete('NovelReader').then(() => {
        console.log('数据库已删除，请刷新页面以重新创建');
        alert('数据库结构已更新，已清除旧数据。请刷新页面以继续。');
        window.location.reload();
      }).catch(delErr => {
        console.error('删除数据库失败:', delErr);
        alert('数据库升级失败，请尝试清除浏览器数据后重试。');
      });
    }
  });

// 导出数据库实例
export default db; 